
package GUI;

import controladoresJPA.ClienteJpaController;
import controladoresJPA.ConnectionFactory;
import controladoresJPA.exceptions.PreexistingEntityException;
import entregapersistencia.Cliente;
import entregapersistencia.ClientePK;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

/**
 * @author Hern&aacute;ndez Abahonza Diana Carolina 1031083
 * @author L&oacute;pez Juan Camilo
 * @author Moncada Mu&nacute;oz Juan David
 */
public class PanelCliente extends JPanel implements ActionListener {
    
    private JLabel lCliente;
    private ArrayList<JLabel> lDatosCliente;
    private ArrayList<JTextField> tfDatosCliente;
    private ArrayList<String> datosCliente;
    private JButton bCrearCliente;
    private JButton bModificarCliente;
    private JButton bEliminarCliente;
    
    private ConnectionFactory fabrica;
    private ClienteJpaController control;
    private Cliente cliente;
    
    public PanelCliente(){
        this.setLayout(new BorderLayout(5,0));//ec, ef
	
	inicializarComponentes();
	organizarComponentes();
    }
    
    private void inicializarComponentes() {
        lCliente = new JLabel("Gestión Clientes", new ImageIcon("images/custom-48x48.png"), SwingConstants.LEFT);
	lCliente.setFont(new Font("Arial", Font.BOLD, 18));
	lCliente.setForeground(new Color(78,79,99,190));
        
        lDatosCliente = new ArrayList<JLabel>();
	lDatosCliente.add( new JLabel( "Apellidos y Nombres (*):" ) );
	lDatosCliente.add( new JLabel( "Tipo de Documento (*):" ) );
	lDatosCliente.add( new JLabel( "Número de Documento (*):" ) );
	lDatosCliente.add( new JLabel( "Teléfono (*):" ) );
	lDatosCliente.add( new JLabel( "Dirección (*):" ) );
	lDatosCliente.add( new JLabel( "Fecha Nacimiento:" ) );
	lDatosCliente.add( new JLabel( "Email:" ) );
        
        tfDatosCliente = new ArrayList<JTextField>();
        
        for(int i=0; i<lDatosCliente.size(); i++){
            lDatosCliente.get(i).setFont(new Font("Arial", Font.BOLD, 14));
            lDatosCliente.get(i).setForeground(new Color(78,79,99,190));
            
            tfDatosCliente.add( new JTextField( "" ) );
	}
			
	bCrearCliente = new JButton("Ingresar Cliente");
	configurarBoton(bCrearCliente);
	bModificarCliente = new JButton("Modificar Cliente");
	configurarBoton(bModificarCliente);
	bEliminarCliente = new JButton("Eliminar Cliente");
	configurarBoton(bEliminarCliente);
        
        datosCliente = new ArrayList();
        fabrica = new ConnectionFactory();
    }
    
    private void configurarBoton(JButton boton) {
        boton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	boton.setRolloverEnabled(false); // Quita la iluminacion al pasar el mouse por el boton 
	//boton.setBorderPainted(false); // Quita el borde del boton
	boton.setBackground(new Color(0,0,0,0)); // Fondo Transparente
	boton.addActionListener(this); // Escucha del boton
    }

    private void organizarComponentes() {
        JPanel pTexto = new JPanel();
	pTexto.setBorder(BorderFactory.createEmptyBorder(180,110,15,110));//n,w,s,e
	pTexto.setBackground(new Color(0,0,0,0));
	pTexto.add(lCliente);
		
	JPanel pFormulario = new JPanel(new GridLayout(lDatosCliente.size(),2,0,0));//i,j,esp_i, esp_j
	pFormulario.setBorder(BorderFactory.createEmptyBorder(15,110,15,110));//n,w,s,e
	pFormulario.setBackground(new Color(0,0,0,0));
	for(int i=0; i<lDatosCliente.size(); i++){
            pFormulario.add(lDatosCliente.get(i));
            pFormulario.add(tfDatosCliente.get(i));
	}
        
        JPanel pBotones = new JPanel(new GridLayout(1,3,5,0));
	pBotones.setBorder(BorderFactory.createEmptyBorder(15,110,180,110));//n,w,s,e
	pBotones.setBackground(new Color(0,0,0,0));
	pBotones.add(bCrearCliente);
	pBotones.add(bModificarCliente);
	pBotones.add(bEliminarCliente);
		
	this.add(pTexto, BorderLayout.NORTH);
	this.add(pFormulario, BorderLayout.CENTER);
	this.add(pBotones, BorderLayout.SOUTH);
    }
    
    private void capturarDatos(){
        datosCliente.clear();
        datosCliente.add( tfDatosCliente.get(0).getText() );
        datosCliente.add( tfDatosCliente.get(1).getText() );
        datosCliente.add( tfDatosCliente.get(2).getText() );
        datosCliente.add( tfDatosCliente.get(3).getText() );
        datosCliente.add( tfDatosCliente.get(4).getText() );
        datosCliente.add( tfDatosCliente.get(5).getText() );
        datosCliente.add( tfDatosCliente.get(6).getText() );
    }
    
    private void limpiarCampos() {
        for(int i=0; i<tfDatosCliente.size(); i++){
            tfDatosCliente.get(i).setText("");
	}
    }
    
    private void crearCliente() throws PreexistingEntityException, Exception {
        capturarDatos();
        ClientePK pk;
        
        cliente = new Cliente();
        pk = new ClientePK();
        
        cliente.setNombre(datosCliente.get(0));
        pk.setTipoId(datosCliente.get(1));
        pk.setTipoId(datosCliente.get(2));
        cliente.setClientePK(pk);
        cliente.setTelefono(datosCliente.get(3));
        cliente.setDireccion(datosCliente.get(4));
        DateFormat df = DateFormat.getDateInstance();
        try {
        Date d = df.parse(datosCliente.get(5));
        cliente.setCumpleaños(d);
        }
        catch(ParseException e) {
        System.out.println("Unable to parse " + datosCliente.get(5));
        }
        cliente.setEmail(datosCliente.get(6));
        
        control.create(cliente);
        limpiarCampos();
        JOptionPane.showMessageDialog(this, "Se ha creado el cliente "+datosCliente.get(0), "Creación Exitosa", JOptionPane.INFORMATION_MESSAGE);
    }

    private void modificarCliente() {
        
    }

    private void eliminarCliente() {
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==bCrearCliente){
            try {
                crearCliente();
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(PanelCliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(PanelCliente.class.getName()).log(Level.SEVERE, null, ex);
            }
	}
		
	if(e.getSource()==bModificarCliente){
            modificarCliente();
	}
        
        if(e.getSource()==bEliminarCliente){
            eliminarCliente();
	}
    }
}
